package com.leonelviera.andronotes;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class NotasBdAdaptador {
	
    public static final String COL_TITULO  = "titulo";
    public static final String COL_DESCRIP = "descripcion";
    public static final String COL_ID 	   = "_id";
    public static final String COL_NOTA_ID = "nota_id"; 
    public static final String COL_USR_ID  = "usuario_id";
    public static final String COL_FEC_MOD = "modificado";
    
    private static final String BD_NOMBRE = "data";
    private static final String TABLA_NOMBRE = "notas";
    private static final String TAG = "NotesDbAdapter";
    private static final int DATABASE_VERSION = 5;
    private static final String DATABASE_CREATE =
        "create table " + TABLA_NOMBRE + " (" 
        	+ COL_ID      + " integer primary key autoincrement, "
            + COL_USR_ID  + " integer not null, " 
        	+ COL_TITULO  + " text not null, " 
            + COL_DESCRIP + " text not null, "    
        	+ COL_NOTA_ID + " integer not null, "
            + COL_FEC_MOD + " integer not null" +
        ");";
    
    
    private final Context mCtx;
    
    private DatabaseHelper mDbHelper;
    private SQLiteDatabase mDb;

    private static class DatabaseHelper extends SQLiteOpenHelper {

        DatabaseHelper(Context context) {
            super(context, BD_NOMBRE, null, DATABASE_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {

            db.execSQL(DATABASE_CREATE);
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
                    + newVersion + ", which will destroy all old data");
            db.execSQL("DROP TABLE IF EXISTS " + TABLA_NOMBRE);
            onCreate(db);
        }
    }

    /**
     * Constructor - takes the context to allow the database to be
     * opened/created
     * 
     * @param ctx the Context within which to work
     */
    public NotasBdAdaptador(Context ctx) {
        this.mCtx = ctx;
    }

    /**
     * Open the notes database. If it cannot be opened, try to create a new
     * instance of the database. If it cannot be created, throw an exception to
     * signal the failure
     * 
     * @return this (self reference, allowing this to be chained in an
     *         initialization call)
     * @throws SQLException if the database could be neither opened or created
     */
    public NotasBdAdaptador open() throws SQLException {
        mDbHelper = new DatabaseHelper(mCtx);
        mDb = mDbHelper.getWritableDatabase();
        return this;
    }

    public void close() {
        mDbHelper.close();
    }

    public long crearNota(String titulo, String descripcion, int usuario_id) {
        ContentValues initialValues = new ContentValues();
        int modificado = (int)(System.currentTimeMillis()/1000);
        
        initialValues.put(COL_TITULO, titulo);
        initialValues.put(COL_DESCRIP, descripcion);
        initialValues.put(COL_USR_ID, usuario_id);
        initialValues.put(COL_NOTA_ID, 0);
        initialValues.put(COL_FEC_MOD, modificado);
        
        long resultado = mDb.insert(TABLA_NOMBRE, null, initialValues);
        		
        if (resultado != -1) {
            AndroNotesWSCalls call = new AndroNotesWSCalls();
            int nota_id = call.guardarNota(usuario_id, titulo, descripcion, modificado);
            if (nota_id != 0)
            	setNotaId(resultado, nota_id);
        }
        
        return resultado;
    }

    
    public long crearNota(String titulo, String descripcion, int usuario_id, int nota_id, int modificada) {
        ContentValues initialValues = new ContentValues();
        
        initialValues.put(COL_TITULO, titulo);
        initialValues.put(COL_DESCRIP, descripcion);
        initialValues.put(COL_USR_ID, usuario_id);
        initialValues.put(COL_NOTA_ID, nota_id);
        initialValues.put(COL_FEC_MOD, modificada);
        
        return mDb.insert(TABLA_NOMBRE, null, initialValues);
        		
    }
    
    public boolean borrarNota(long id, boolean propagar) {
    	Cursor c = getNota(id);
    	int nota_id = c.getInt(c.getColumnIndex(COL_NOTA_ID));
    	boolean resultado = mDb.delete(TABLA_NOMBRE, COL_ID + "=" + id, null) > 0;
		
        if (resultado && propagar) {
            AndroNotesWSCalls call = new AndroNotesWSCalls();
            call.borrarNota(nota_id);
        }
        
        return resultado;
    }
    
    
    public Cursor getNotasUsuario(int usuario_id) {

        return mDb.query(TABLA_NOMBRE, 
        				 new String[] {COL_ID, COL_TITULO, COL_DESCRIP, COL_NOTA_ID, COL_USR_ID, COL_FEC_MOD},
        				 COL_USR_ID + "=" + usuario_id, null, null, null, null);
    }

    public Cursor getNotasUsuario(int usuario_id, int nota_id) {

        return mDb.query(TABLA_NOMBRE, 
        				 new String[] {COL_ID, COL_TITULO,COL_DESCRIP, COL_NOTA_ID, COL_USR_ID, COL_FEC_MOD}, 
        				 COL_USR_ID + "=" + usuario_id + " AND " + COL_NOTA_ID + "=" + nota_id,
        				 null, null, null, null);
    }
    
    
    public Cursor getNota(long id) throws SQLException {

        Cursor mCursor =

            mDb.query(true, TABLA_NOMBRE, 
            		  new String[] {COL_ID, COL_TITULO, COL_DESCRIP, COL_NOTA_ID, COL_USR_ID, COL_FEC_MOD},
            		  COL_ID + "=" + id, null, null, null, null, null);
        if (mCursor != null) {
            mCursor.moveToFirst();
        }
        return mCursor;

    }
    
    public Cursor getNotaPorNotaId(Integer nota_id) throws SQLException {

        Cursor mCursor =
        		
            mDb.query(true, TABLA_NOMBRE, 
            		new String[] {COL_ID, COL_TITULO, COL_DESCRIP, COL_NOTA_ID, COL_USR_ID, COL_FEC_MOD}, 
            		COL_NOTA_ID + "=" + nota_id, null, null, null, null, null);
        
        if (mCursor != null) {
            mCursor.moveToFirst();
        }
        return mCursor;

    }

    public boolean modificarNota(long id, String titulo, String descripcion, int nota_id) {
        ContentValues args = new ContentValues();
        int modificado = (int)(System.currentTimeMillis()/1000);
        
        args.put(COL_TITULO, titulo);
        args.put(COL_DESCRIP, descripcion);
        args.put(COL_FEC_MOD, modificado);
        
        int resultado = mDb.update(TABLA_NOMBRE, args, COL_ID + "=" + id, null);
		
        if (resultado > 0) {
            AndroNotesWSCalls call = new AndroNotesWSCalls();
            call.modificarNota(nota_id, titulo, descripcion, modificado);
        }
        
        return resultado > 0;
    }
    
    public boolean modificarNota(int nota_id, String titulo, String descripcion, int modificado) {
        ContentValues args = new ContentValues();
        
        args.put(COL_TITULO, titulo);
        args.put(COL_DESCRIP, descripcion);
        args.put(COL_FEC_MOD, modificado);
        
        return mDb.update(TABLA_NOMBRE, args, COL_NOTA_ID + "=" + nota_id, null) > 0;
    }
    
    public boolean setNotaId(long id, Integer nota_id) {
        ContentValues args = new ContentValues();
        args.put(COL_NOTA_ID, nota_id);

        return mDb.update(TABLA_NOMBRE, args, COL_ID + "=" + id, null) > 0;
    }
    
}
